#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
void readfun();
void writefun();
char buffer[256];
int buffer_has_item = 0; //若是1，表示缓冲区有数据可以读取，只要有写入数据就会设置为1
int retflag = FALSE;     //表示数据的上限，初始为false表示没有到达上限
pthread_mutex_t mutex;

//首先创建一个读线程，然后初始化互斥锁，
//接着在主线程中调用writefun函数开始写入数据，最后通过exit(0)退出程序。
//整个过程中，读线程和写线程可以并发执行，通过互斥锁来保证对共享资源的安全访问。

int main(void)
{
    pthread_t reader;
    pthread_mutex_init(&mutex, NULL);
    pthread_create(&reader, NULL, (void *)&readfun, NULL); //子线程
    writefun();                                            //主线程
    exit(0);
}
void readfun(void)
{
    while (1)
    {
        if (retflag) //初始为FALSE，没有数据可读
        {
            return;
        }
        pthread_mutex_lock(&mutex);
        if (buffer_has_item == 1)
        {
            printf("%s", buffer);
            //在readfun函数中，当buffer_has_item为1时，表示缓冲区中有数据可供读取，读取完成后将buffer_has_item标志设置为0，表示缓冲区已被读取。
            buffer_has_item = 0;
        }
        pthread_mutex_unlock(&mutex);
    }
    return;
}
void writefun(void)
{
    int i = 0;
    while (1)
    {
        if (i == 10) //队满，不再写入
        {
            retflag = TRUE; //当写入次数达到上限（10次）时，将retflag标志设置为TRUE，表示不再写入数据。
            return;
        }
        pthread_mutex_lock(&mutex);
        if (buffer_has_item == 0)
        {
            sprintf(buffer, "This is %d\n", i++);
            //当缓冲区中没有数据时，会将数据写入缓冲区，并将buffer_has_item标志设置为1，表示缓冲区中有数据可供读取。
            buffer_has_item = 1;
        }
        pthread_mutex_unlock(&mutex);
    }
    return;
}
